# -*- coding=utf-8-*-
"""
@File:memory_selection
@Author:Created by Han X.Y
@Date:on 2021/7/19 11:42 
"""
"""
给你一个链表的头节点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
 

示例 1：


输入：head = [1,2,6,3,4,5,6], val = 6
输出：[1,2,3,4,5]
示例 2：

输入：head = [], val = 1
输出：[]
示例 3：

输入：head = [7,7,7,7], val = 7
输出：[]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


"""


# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        """
        遍历的方式实现:
        新增一个dummy节点, 方便遍历和最后返回结果
        p 指针向后遍历, 向前探一个节点, 如果val相等, 则需要跳过 next 节点
        """
        dummy = ListNode()  # 先创建一个空
        dummy.next = head
        tmp = dummy
        while tmp:
            if tmp.next and tmp.next.val == val:
                # 跳过 tmp.next 节点
                tmp.next = tmp.next.next
            else:
                tmp = tmp.next
        return dummy.next

class MySignalLinked:
    """
    定义一个类实现链表的增加
    """
    def __init__(self):
        self.head=None
        self.length=0

    def append(self,dataOrNode):
        item=None
        if isinstance(dataOrNode,ListNode):
            item=dataOrNode
        else:
            item=ListNode(dataOrNode)
        print(item,item.val,item.next)

        if not self.head:
            self.head=item
            self.length+=1
        else:
            node=self.head
            while node.next:
                node=node._next
            node._next=item
            self.length+=1



class Solution2:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        """
        使用递归的方式实现：
       通过递归的方法去删除节点
        递归程序会先一路遍历来到节点尾部
        从后往前把val符合的节点进行删除, 并重新把链表连接起来
        """
        if head is None:
            return head

        # removeElement方法会返回下一个Node节点
        head.next = self.removeElements(head.next, val)

        if head.val == val:
            next_node = head.next
        else:
            next_node = head
        return next_node

if __name__ == '__main__':
    my_signal_link=MySignalLinked()
    print(my_signal_link.head)
    for i in [1,2,6,3,4,5,6]:
        my_signal_link.append(i)


